package tadp.tp.domain;

import java.util.ArrayList;
import java.util.List;
import Observers.Observador;


public class Reunion {
	private  List<Reservable> RecursosObligatorios=new ArrayList<Reservable>();
	private  List<Reservable> RecursosOpcionales=new ArrayList<Reservable>();
	private Edificio edificio;
	private List<Persona> personas = new ArrayList<Persona>();
	private HorarioDeReuniones horario;
	private Fecha fecha;
	private int cantidadDeMailsEnviados = 0;
	private List<Observador> observadores=new ArrayList<Observador>();
	

	public Reunion(List<Persona> personasSeleccionadas, Edificio unEdificio,
			HorarioDeReuniones unHorarioDeReunion,List<Observador> unosObservadores) {
		this.setPersonas(personasSeleccionadas);
		this.setEdificio(unEdificio);
		this.setHorario(unHorarioDeReunion);
		this.setObservadores(unosObservadores);
	}

	public void reservar(ArrayList<Reservable> reservables, String horaInicial,
			String horaFinal, Fecha fecha) {           
		for (Reservable unReservable : reservables) {
			if(unReservable.getAgenda().estaDisponibleEntre(horaInicial, horaFinal, fecha)){
				unReservable.getAgenda().agendarEntre(horaInicial, horaFinal, fecha); 
			}
		}
	}

	public Double costoReunion() {
		Double costo = 0.0;
		for (Persona unaPersona : personas) {
			if (!unaPersona.getEdificio().equals(this.getEdificio())) {
				costo += unaPersona.getCostoTransporte();
			}
			costo += unaPersona.getValorHora() * (this.duracionDeReunion());
		}
		return costo;
	}
	
	public Boolean requiereCatering() {
		boolean catering = false;
		for (Persona unaPersona : personas) {
			if (unaPersona.getRol().equals("proyect lider")) {
				catering = true;
			}
		}
		return catering;
	}

	private Double duracionDeReunion() {
		return (double) (Integer.parseInt(this.horario.getHoraFin()) - Integer
				.parseInt(this.horario.getHoraComienzo()));
	}
	
	public int cantidadDePersonasQueViajan() {
		int cantidadViajantes = 0;
		for (Persona persona : personas) {
			if(persona.getEdificio() != this.getEdificio()) {
				cantidadViajantes++;
			}
		}
		return cantidadViajantes;
	}

	public void sacarPersona(Persona persona) {
		this.avisar(persona);
		this.personas.remove(persona);	
	}

	public void avisar(Persona persona) {
		for(Observador unObservador : this.getObservadores()){
			unObservador.realizarAccion(this, persona);
		}
	}

	public void cancelar() {
		for(Persona unaPersona:this.getPersonas()){
			unaPersona.getAgenda().getReuniones().remove(this.getHorario());
			//this.getPersonas().remove(unaPersona);
		}
	}
	
	public void replanificar(Fecha fecha2) {
		this.cancelar();
		for(Persona unaPersona:this.getPersonas()){
			unaPersona.getAgenda().agendarEntre(this.getHorario().getHoraComienzo(), this.getHorario().getHoraFin(), fecha2);
		}
		this.setFecha(fecha2);
	}
	
	public Fecha getFecha() {
		return fecha;
	}
	
	public void setFecha(Fecha fecha) {
		this.fecha = fecha;
	}
	
	public Edificio getEdificio() {
		return edificio;
	}

	public void setEdificio(Edificio edificio) {
		this.edificio = edificio;
	}

	public List<Persona> getPersonas() {
		return personas;
	}

	public void setPersonas(List<Persona> personas) {
		this.personas = personas;
	}

	public HorarioDeReuniones getHorario() {
		return horario;
	}

	public void setHorario(HorarioDeReuniones horario) {
		this.horario = horario;
	}

	public List<Reservable> getRecursosObligatorios() {
		return RecursosObligatorios;
	}

	public void setRecursosObligatorios(List<Reservable> recursosObligatorios) {
		RecursosObligatorios = recursosObligatorios;
	}

	public List<Reservable> getRecursosOpcionales() {
		return RecursosOpcionales;
	}

	public void setRecursosOpcionales(List<Reservable> recursosOpcionales) {
		RecursosOpcionales = recursosOpcionales;
	}

	public void enviarMail() {
		this.cantidadDeMailsEnviados++;		
	}
	
	public int getCantidadDeMailsEnviados() {
		return cantidadDeMailsEnviados;
	}

	public List<Observador> getObservadores() {
		return observadores;
	}

	public void setObservadores(List<Observador> observadores) {
		this.observadores = observadores;
	}

}
